<!doctype html>
<html lang="zh-cn">
  <head>
    <title>生成器的创建方式 // JW Blog</title>
    <meta charset="utf-8" />
    <meta name="generator" content="Hugo 0.60.1" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <meta name="author" content="John Doe" />
    <meta name="description" content="" />
    <link rel="stylesheet" href="https://duyi111.gitee.io/css/main.min.f90f5edd436ec7b74ad05479a05705770306911f721193e7845948fb07fe1335.css" />

    
    <meta name="twitter:card" content="summary"/>
<meta name="twitter:title" content="生成器的创建方式"/>
<meta name="twitter:description" content="1.生成器的介绍  根据程序员制定的规则循环生成数据，当条件不成立时则生成数据结束。数据不是一次性全部生成出来，而是使用一个，再生成一个，可以节约大量的内存。  2.创建生成器的方式  1.生成器推导式 2.yield关键字  3. 生成器推导式  与列表推导式类似，只不过生成器推导式使用小括号 # 创建生成器 my_generator = (i * 2 for i in range(5)) print(my_generator) # next获取生成器下一个值 value = next(my_generator) print(value) # 遍历生成器 for value in my_generator: print(value)  next函数获取生成器中的下一个值 for循环遍历生成器中的每一个值  # 运行结果： &lt;generator object &lt;genexpr&gt; at 0x101367048&gt; 0 2 4 6 8   4.yield关键字  只要在def函数里面看到有yield关键字那么就是生成器 def my_generator(n)： for i in range(n): print(&#39;开始生成。。。&#39;) yield i print(&#39;完成一次。。。&#39;) if __name__ == &#39;__main__&#39;: g = my_generator(2) # 获取生成器中下一个值 result = next(g) print(result) while True: try: result = next(g) print(result) except StopIteration as e: break for遍历生成器，for循环内部自动处理了停止迭代异常，使用起来更加方便 for i in g： print(i)  代码执行到yield会暂停,然后把结果返回出去，下次启动生成器会在暂停的位置继续往下执行。 生成器如果把数据生成完成，再次获取生成器中的下一个数据会抛出一个StopIteration异常，表示停止迭代异常。 while循环内部没有处理异常操作，需要手动添加处理异常操作。 for循环内部自动处理了停止迭代异常，使用起来更加方便，推荐使用。  # 运行结果： 开始生成。。。 0 完成一次。。。 开始生成。。。 1 完成一次。。。   5."/>

    <meta property="og:title" content="生成器的创建方式" />
<meta property="og:description" content="1.生成器的介绍  根据程序员制定的规则循环生成数据，当条件不成立时则生成数据结束。数据不是一次性全部生成出来，而是使用一个，再生成一个，可以节约大量的内存。  2.创建生成器的方式  1.生成器推导式 2.yield关键字  3. 生成器推导式  与列表推导式类似，只不过生成器推导式使用小括号 # 创建生成器 my_generator = (i * 2 for i in range(5)) print(my_generator) # next获取生成器下一个值 value = next(my_generator) print(value) # 遍历生成器 for value in my_generator: print(value)  next函数获取生成器中的下一个值 for循环遍历生成器中的每一个值  # 运行结果： &lt;generator object &lt;genexpr&gt; at 0x101367048&gt; 0 2 4 6 8   4.yield关键字  只要在def函数里面看到有yield关键字那么就是生成器 def my_generator(n)： for i in range(n): print(&#39;开始生成。。。&#39;) yield i print(&#39;完成一次。。。&#39;) if __name__ == &#39;__main__&#39;: g = my_generator(2) # 获取生成器中下一个值 result = next(g) print(result) while True: try: result = next(g) print(result) except StopIteration as e: break for遍历生成器，for循环内部自动处理了停止迭代异常，使用起来更加方便 for i in g： print(i)  代码执行到yield会暂停,然后把结果返回出去，下次启动生成器会在暂停的位置继续往下执行。 生成器如果把数据生成完成，再次获取生成器中的下一个数据会抛出一个StopIteration异常，表示停止迭代异常。 while循环内部没有处理异常操作，需要手动添加处理异常操作。 for循环内部自动处理了停止迭代异常，使用起来更加方便，推荐使用。  # 运行结果： 开始生成。。。 0 完成一次。。。 开始生成。。。 1 完成一次。。。   5." />
<meta property="og:type" content="article" />
<meta property="og:url" content="https://duyi111.gitee.io/post/%E7%94%9F%E6%88%90%E5%99%A8%E7%9A%84%E5%88%9B%E5%BB%BA%E6%96%B9%E5%BC%8F/" />
<meta property="article:published_time" content="2020-02-09T21:07:17+08:00" />
<meta property="article:modified_time" content="2020-02-09T21:07:17+08:00" />


  </head>
  <body>
    <header class="app-header">
      <a href="https://duyi111.gitee.io/"><img class="app-header-avatar" src="/avatar.jpg" alt="John Doe" /></a>
      <h1>JW Blog</h1>
      <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc vehicula turpis sit amet elit pretium.</p>
      <div class="app-header-social">
        
      </div>
    </header>
    <main class="app-container">
      
  <article class="post">
    <header class="post-header">
      <h1 class ="post-title">生成器的创建方式</h1>
      <div class="post-meta">
        <div>
          <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="icon icon-calendar">
  <title>calendar</title>
  <rect x="3" y="4" width="18" height="18" rx="2" ry="2"></rect><line x1="16" y1="2" x2="16" y2="6"></line><line x1="8" y1="2" x2="8" y2="6"></line><line x1="3" y1="10" x2="21" y2="10"></line>
</svg>
          Feb 9, 2020
        </div>
        <div>
          <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="icon icon-clock">
  <title>clock</title>
  <circle cx="12" cy="12" r="10"></circle><polyline points="12 6 12 12 16 14"></polyline>
</svg>
          1 min read
        </div></div>
    </header>
    <div class="post-content">
      <h2 id="1">1.生成器的介绍</h2>
<ul>
<li>根据程序员制定的规则循环生成数据，当条件不成立时则生成数据结束。数据不是一次性全部生成出来，而是使用一个，再生成一个，可以节约大量的内存。</li>
</ul>
<h2 id="2">2.创建生成器的方式</h2>
<ul>
<li>1.生成器推导式</li>
<li>2.<code>yield</code>关键字</li>
</ul>
<h2 id="3-">3. 生成器推导式</h2>
<ul>
<li>与列表推导式类似，只不过生成器推导式使用小括号
<pre><code># 创建生成器
my_generator = (i * 2 for i in range(5))
print(my_generator)
  
# next获取生成器下一个值
value = next(my_generator)
print(value)
  
# 遍历生成器
for value in my_generator:
    print(value)
</code></pre><ul>
<li><code>next</code>函数获取生成器中的下一个值</li>
<li><code>for</code>循环遍历生成器中的每一个值</li>
</ul>
<pre><code># 运行结果：
&lt;generator object &lt;genexpr&gt; at 0x101367048&gt;
0
2
4
6
8
</code></pre></li>
</ul>
<h2 id="4yield">4.yield关键字</h2>
<ul>
<li>只要在def函数里面看到有yield关键字那么就是生成器
<pre><code>def my_generator(n)：
    for i in range(n):
        print('开始生成。。。')
        yield i
        print('完成一次。。。')
  
  
if __name__ == '__main__':
  
    g = my_generator(2)
      
    # 获取生成器中下一个值
    result = next(g)
    print(result)
  
      
    while True:
        try:
            result = next(g)
            print(result)
        except StopIteration as e:
            break
              
      
    for遍历生成器，for循环内部自动处理了停止迭代异常，使用起来更加方便  
    for i in g：
        print(i)
  
</code></pre><ul>
<li>代码执行到<code>yield</code>会暂停,然后把结果返回出去，下次启动生成器会在暂停的位置继续往下执行。</li>
<li>生成器如果把数据生成完成，再次获取生成器中的下一个数据会抛出一个<code>StopIteration</code>异常，表示停止迭代异常。</li>
<li><code>while</code>循环内部没有处理异常操作，需要手动添加处理异常操作。</li>
<li><code>for</code>循环内部自动处理了停止迭代异常，使用起来更加方便，推荐使用。</li>
</ul>
<pre><code># 运行结果：
  
开始生成。。。
0
完成一次。。。
开始生成。。。
1
完成一次。。。
  
</code></pre></li>
</ul>
<h2 id="5">5.生成器的使用场景</h2>
<ul>
<li>使用生成器实现斐波那契数列
<pre><code>def fibonacci(num):
    a = 0
    b = 1

    # 记录生成fibonacci数字的下标
    current_index = 0

    while current_index &lt; num:
        result = a
        a, b = b, a + b
        current_index += 1
        # 代码执行到yield会暂停，然后把结果返回出去，下次启动生成器会在暂停的位置继续往下执行
        yield result


fib = fibonacci(5)
# 遍历生成的数据
for value in fib:
    print(value)
  
  
  
# 运行结果：
0
1
1
2
3
</code></pre></li>
</ul>
<h2 id="6">6.小结</h2>
<ul>
<li>生成器是根据算法生成数列的一种机制，每次调用生成器只生成一个值，可以节省大量内存。</li>
<li>生成器的创建有两种方式
<ul>
<li>1.生成器推导式</li>
<li>2.<code>yield</code>关键字</li>
</ul>
</li>
</ul>

    </div>
    <div class="post-footer">
      
    </div>
  </article>

    </main>
  </body>
</html>
